package br.org.isvi.interpretador.portugol.operations;

import br.org.isvi.interpretador.portugol.InterpreterResolver;
import br.org.isvi.interpretador.portugol.OperationResolver;
import br.org.isvi.interpretador.portugol.exception.SemanticErrorException;
import br.org.isvi.interpretador.portugol.types.BooleanSymbol;
import br.org.isvi.interpretador.portugol.types.Kind;
import br.org.isvi.interpretador.portugol.types.Symbol;

public class OrResolver implements OperationResolver {
	
	public OrResolver() {
		super();
	}

	public Symbol execute() {
		
		Symbol value = InterpreterResolver.instance.popStack();
		Symbol value2 = InterpreterResolver.instance.popStack();
		
		if(UtilsValidator.getRealVariableValue(value).getKind() != Kind.BOOLEANO || UtilsValidator.getRealVariableValue(value2).getKind() != Kind.BOOLEANO)
			throw new SemanticErrorException("Os Tipos " + UtilsValidator.getRealVariableValue(value2).getKind() + " e " + UtilsValidator.getRealVariableValue(value).getKind() + " não são compatíveis nesta operação!");
		
		Boolean val1 = (Boolean)UtilsValidator.getRealVariableValue(value2).getValue();
		Boolean val2 = (Boolean)UtilsValidator.getRealVariableValue(value).getValue();
		
		
		
		return new BooleanSymbol(val2 || val1);
	}

}
